package jee.boot.common.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * Column注解定义
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {

	/**
	 * 对应的列名称,如果不加这个注解,表示使用字段名的驼峰转换为对应列名
	 */
	String name() default "";
	/**
	 * 外键字段,当本表与关联表的关联字典需要特殊指定时候,比如使用本表的id字段与关联表的entity_id进行关联的时候,可以设置key="id"
	 */
	String key() default "";
	/**
	 * 对象类型保存:比如user中包含一个company对象,在存储的时候取 company的id属性存储到user表的company_id字段里,则可设置data=["company.id"](不设置的话,默认使用company.id属性),.默认取当前对象的id属性<br>
	 * 对象类型查询:比如要查询在用户信息中要关联查询company的id.name.address等数据则可设置data=["company.id","company.name","company.address"]
	 */
	String[] data() default {};

	/**
	 * 如果是对象类型的,默认拼接的sql中关联查询当前表,如果不需要关联,请设置为false
	 *
	 */
	boolean joinTable() default true;

	/**
	 * 操作类型,根据不同的操作生成不同的sql,识别当前属性是否需要生成到对应的操作sql中
	 * @return
	 */
	Action action() default Action.ALL;

	/**
	 * 在拼接查询sql时候,忽略表别名,一般适用于非正常列的查询,比如count(...),sum(..)等
	 * @return
	 */
	boolean ignoreAlias() default false;

	/**
	 * 额外的join条件,适用于join的字段的额外的过滤,
	 * 比如 left join sys_office dept on a.dept_id=dept.id and dept.type='123'
	 *  name extraConditions的配置为{"dept.type='123'"}
	 * @return
	 */
	String[] extraConditions() default {};

	/**
	 * 关联类型,默认 left join
	 * @return
	 */
	JoinType joinType() default JoinType.LEFT_JOIN;

	/**
	 * 此注解适用于需要额外关联表的情况,我们的Column默认只关联一层的,如果想要关联多层的表,就要借助fkTable来实现
	 * @return
	 */
	FkTable[] fkTable() default {};
	enum Action{
		ALL,
		SAVE,
		UPDATE,
		QUERY,
		NULL
	}
	enum JoinType{
		LEFT_JOIN,
		RIGHT_JOIN,
		INNER_JOIN
	}

}
